package cn.ainit.sys.framework.save;

import java.sql.Date;
import java.sql.Timestamp;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.junit.Test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


import cn.ainit.common.ReturnObject;
import cn.ainit.sys.utils.UUID32;

@Controller
@RequestMapping("/commsave")
public class CommonSaveController {
	
	private CommonSaveService commonSaveService;
	
	@Resource
	public void setCommonSaveService(CommonSaveService commonSaveService) {
		this.commonSaveService = commonSaveService;
	}
	/****
	 * 1.  data.msg == 'success'  infob 主键的返回字符串     $.messager.alert('操作提示','sou =1 2 保存/更新成功','')  （info  提示信息—）
	 * 				   'fail'     info  提示信息“失败的原因”    $.messager.alert('操作提示',data.info,'info')
	 * 				   'error'	  info  提示					$.messager.alert('操作提示',data.info,'error')
	 * @param receiveObjs
	 * @param request
	 * @return
	 * @author Xuzq
	 * @date 2014-4-19 下午03:20:29
	 */
	@RequestMapping("/comm")
	@ResponseBody
	public ReturnObject saveComm(@RequestBody List<ReceiveObj> receiveObjs,HttpServletRequest request,HttpSession session){
		ReturnObject returnObject = new ReturnObject();
		try {
			ReceiveObj receiveObj = null;
			if (receiveObjs == null || receiveObjs.isEmpty()) {
				returnObject.setMsg("fail");
				returnObject.setInfo("没有需要修改的信息");
			}
			String tmpInfoB = "";
			for(int i = 0;  i < receiveObjs.size(); i++){
				receiveObj = receiveObjs.get(i);
				if (receiveObjs == null || receiveObjs.isEmpty()) {
					returnObject.setMsg("fail");
					returnObject.setInfo("前台数据未传入，请检查！");
					return returnObject;
				}
				returnObject = commonSaveService.saveComm(receiveObj.getDiu(),receiveObj.getDsid(),receiveObj.getMapRecord(),session);
//				if (i == 0) {
//					tmpInfoB = returnObject.getInfob().toString();
//				}
				if ("fail".equals(returnObject.getMsg())) {
					returnObject.setMsg("fail");
					returnObject.setInfo("第"+i+"条数据保存出错");
					return returnObject;
				}else {
					returnObject.setMsg("success");
				}
			}
			//设置主表返回的字段信息
//			returnObject.setInfob(new StringBuffer(tmpInfoB));
			
			//判断returnobject 的信息
			returnObject.getTraState();  // 执行之后的状态
		} catch (Exception e) {
			e.printStackTrace();
			returnObject.setMsg("error");
			returnObject.setInfo(e.getMessage());
		}
		return returnObject;
	}
	/***
	 * 保存一对多 （采用V2.0.0方法，本方法超过十天可删除 2014.06.22）
	 * @param receiveObjs
	 * @param request
	 * @param session
	 * @return
	 * @author Xuzq
	 * @date 2014-6-19 下午02:22:47
	 */
//	@RequestMapping("/savedatagrid")
//	@ResponseBody
//	public ReturnObject saveCommDG(@RequestBody List<ReceiveObj> receiveObjs,HttpServletRequest request,HttpSession session){
//		ReturnObject returnObject = new ReturnObject();
//		try {
////			row= {"diu":"1","dsid":mdsId,'mapRecord':tmp};
//			ReceiveObj receiveObj = null;
//			if (receiveObjs == null || receiveObjs.isEmpty()) {
//				returnObject.setMsg("fail");
//				returnObject.setInfo("没有需要修改的信息");
//			}
//			String tmpInfoB = "";
//			String fkid = UUID32.newGuid();
//			String djdsid = "";
////			StatementParamT sparam = new StatementParamT();
//				
//			for(int i = 0;  i < receiveObjs.size(); i++){
//				receiveObj = receiveObjs.get(i);
//				if (receiveObjs == null || receiveObjs.isEmpty()) {
//					returnObject.setMsg("fail");
//					returnObject.setInfo("前台数据未传入，请检查！");
//					return returnObject;
//				}
//				djdsid = receiveObj.getDjdsid();
//				if (djdsid == null || djdsid.equals("")) {
//					returnObject.setMsg("fail");
//					returnObject.setInfo("本单据的dsid未传入，请检查！");
//					return returnObject;
//				}
//				returnObject = commonSaveService.saveCommDG(djdsid, fkid,receiveObj.getDiu(),receiveObj.getSinId(),receiveObj.getDsid(),receiveObj.getMapRecord(),session);
////				if (i == 0) {
////					tmpInfoB = returnObject.getInfob().toString();
////				}
//				if ("fail".equals(returnObject.getMsg())) {
//					returnObject.setMsg("fail");
//					returnObject.setInfo("第"+i+"条数据保存出错");
//					return returnObject;
//				}
//			}
//			returnObject.setInfo(fkid);
//			returnObject.setMsg("success");
//			//判断returnobject 的信息
//			returnObject.getTraState();  // 执行之后的状态
//		} catch (Exception e) {
//			e.printStackTrace();
//			returnObject.setMsg("error");
//			returnObject.setInfo(e.getMessage());
//		}
//		return returnObject;
//	}	
//	
	/***
	 * 保存一对多     V2.0.0
	 * @param receiveObjs
	 * @param request
	 * @param session
	 * @return
	 * @author Xuzq
	 * @date 2014-6-19 下午02:22:47
	 * 实现机制：将sinId dsid的数据全部删除
	 */
	@RequestMapping("/savedatagrid")
	@ResponseBody
	public ReturnObject saveCommDG_A(@RequestBody ReceiveOtM omObj,HttpServletRequest request,HttpSession session){
		ReturnObject returnObject = new ReturnObject();
		try {
			ReceiveObj receiveObj = null;
			String tmpInfoB = "";
			String fkid = UUID32.newGuid();
			String djdsid = "";
			//将主键赋值给 RETURN.INFO
			returnObject = commonSaveService.saveCommDGOTM(omObj,session);
		} catch (Exception e) {
			e.printStackTrace();
			returnObject.setMsg("error");
			returnObject.setInfo(e.getMessage());
		}
		return returnObject;
	}	
	
	
	
	
//*********旧版本保存数据**** 屏蔽日期 2014.05.20 超过十天即可删除****************************************************************************************************
//
//	@RequestMapping("saveS")
//	@ResponseBody
//	public ReturnObject saveObjS(String sou,@RequestBody  String mapRecord,String pks,String dsId,HttpServletRequest request){
//		ReturnObject returnObject = new ReturnObject();
//		List<String> nameValues = new ArrayList<String>();
//		try {
//			StatementParamT stmt = new StatementParamT();
//			//保存方法
//			stmt = createSaveSql(dsId,mapRecord,pks,sou,request);
//			if(sou == null ||( sou != null && sou.equals("0"))){
//			    System.out.println("保存数据");
//			    System.out.println(stmt.getSql());
//			  //保存数据
//				if(commonSaveService.saveObj(stmt.getSql().toString(),stmt.getCvalues())){
//					returnObject.setTmpObj(stmt.getReturnPk());
//				}
//			}else if(sou != null && sou.equals("1")){
//				System.out.println("更新数据");
//				System.out.println(stmt.getSql().toString());
//				if (commonSaveService.updateObj(stmt.getSql().toString(),stmt.getCvalues(),stmt.getWvalues())) {
//					returnObject.setMsg("usuccess");
//				}else {
//					returnObject.setMsg("fail");
//				}
//			}
//			else if(sou != null && sou.equals("2")){
//				System.out.println("更新数据");
//				System.out.println(stmt.getSql().toString());
//				if (commonSaveService.updateObj(stmt.getSql().toString(),stmt.getCvalues(),stmt.getWvalues())) {
//					returnObject.setMsg("usuccess");
//				}else {
//					returnObject.setMsg("fail");
//				}
//			}	
//			returnObject.setMsg("success");
//			returnObject.setNameValue(nameValues);
//		} catch (Exception e) {
//			e.printStackTrace();
//			returnObject.setMsg("error");
//			returnObject.setInfo(e.getMessage());
//		}
//		return returnObject;
//	}
//	
//
//	@RequestMapping("saveO")
//	@ResponseBody
//	public ReturnObject saveObjO(String dsId,String info,String pks,String sou,HttpServletRequest request){
//		ReturnObject returnObject = new ReturnObject();
//		returnObject.setMsg("success");
//		return returnObject;
//	}
//	
//	@RequestMapping("saveM")
//	@ResponseBody
//	public ReturnObject saveObjM(String dsId,String info,String pks,String sou,HttpServletRequest request){
//		ReturnObject returnObject = new ReturnObject();
//		returnObject.setMsg("success");
//		return returnObject;
//	}
//	
//	
//	
//
//	@RequestMapping("saveI")
//	@ResponseBody
//	public ReturnObject saveObj(String dsId,String info,String pks,String sou,HttpServletRequest request){
//		ReturnObject returnObject = new ReturnObject();
//		List<String> nameValues = new ArrayList<String>();
//		try {
//			StatementParamT stmt = new StatementParamT();
//			//保存方法
//			stmt = createSaveSql(dsId,info,pks,sou,request);
//			if(sou == null ||( sou != null && sou.equals("1"))){
//			    System.out.println("保存数据");
//			    System.out.println(stmt.getSql());
//			  //保存数据
//				if(commonSaveService.saveObj(stmt.getSql().toString(),stmt.getCvalues())){
//					returnObject.setTmpObj(stmt.getReturnPk());
//				}
//			}else if(sou != null && sou.equals("2")){
//				System.out.println("更新数据");
//				System.out.println(stmt.getSql().toString());
//				if (commonSaveService.updateObj(stmt.getSql().toString(),stmt.getCvalues(),stmt.getWvalues())) {
//					returnObject.setMsg("usuccess");
//				}else {
//					returnObject.setMsg("fail");
//				}
//			}	
//			returnObject.setMsg("success");
//			returnObject.setNameValue(nameValues);
//		} catch (Exception e) {
//			e.printStackTrace();
//			returnObject.setMsg("error");
//			returnObject.setInfo(e.getMessage());
//		}
//		return returnObject;
//	}
//	
//	//拼接sql语句
//	public StatementParamT createSaveSql(String dsId,String info,String pks,String sou,HttpServletRequest request) throws Exception{
//		StatementParamT stmt = new StatementParamT();
//		//将数据库中的字段缓存
//		//将界面的数据设值（如果是主键，采取主键的设置规则）
//		//注：如果是时间类型的 则变化 成  to_date   datetime  date  time 
//		//获取字段
//		List<SysColumns> columns =  new ArrayList<SysColumns>();
//		//获取表名
//		DataStore dataStore = commonSaveService.loadDS(dsId);
//		String tableName = dataStore.getUpdateTable();
//		
//		//处理数据库字段
//		columns = commonSaveService.loadColumns(dsId);
//		Map<String, SysColumns> columnsMap = new HashMap<String, SysColumns>();
//		//缓存主键字段
//		List<String> pkColumns = new ArrayList<String>();
//		//将所有字段放到map
//		for (int i = 0; i < columns.size(); i++) {
//			columnsMap.put(columns.get(i).getName(), columns.get(i));
//			if (columns.get(i).getIsPkAdd() != null && columns.get(i).getIsPkAdd().equals("T") ) {
//				pkColumns.add(columns.get(i).getName());
//			}
//		}
//		//处理传入的字段
//		Map<String, String> inColumnsM = new HashMap<String, String>();
//		//处理界面传入的字段
//		String[] infoS = info.split("\\+");
//		String[] tmpS = new String[2];
//		String tmpInfo = "";
//		for (int i = 0; i < infoS.length; i++) {
//			tmpInfo = infoS[i];
//			tmpS[0] = tmpInfo.substring(0,infoS[i].indexOf("-"));
//			tmpS[1] = tmpInfo.substring(infoS[i].indexOf("-")+1,infoS[i].length());
//			while (tmpS[1].indexOf("%2B") >= 0) {
//				tmpS[1] = tmpS[1].replaceFirst("%2B", "+");
//			}
//			inColumnsM.put(tmpS[0], tmpS[1]);
//		}
//		//判断主键是否都传入了
//		for (int i = 0; i < pkColumns.size(); i++) {
//			if (!inColumnsM.containsKey(pkColumns.get(i))) {
//				throw new RuntimeException("表主键["+pkColumns.get(i)+"]没传入，请联系开发测试修改！");
//			}
//		}
//		//----声明缓存变量---------------------------------
//		SysColumns tmpColn = null;
//		String tmpValues = "";
//		
//		if (sou != null && sou.equals("1")) {
//			for (int i = 0; i < infoS.length; i++) {
//				tmpInfo = infoS[i];
//				tmpS[0] = tmpInfo.substring(0,infoS[i].indexOf("-"));
//				tmpS[1] = tmpInfo.substring(infoS[i].indexOf("-")+1,infoS[i].length());
//				tmpColn = columnsMap.get(tmpS[0]);
//				if (tmpColn != null) {
//					stmt.getCname().add(tmpS[0]);
//					if (tmpColn.getIsPkAdd() != null && tmpColn.getIsPkAdd().equals("T")) {
//						
//						tmpValues = formatPkValue(tmpS.length == 2 ?tmpS[1]:""
//								                   ,tmpColn.getDefaultValueAdd(),tmpColn.getInputtypeAdd(),request);
//						stmt.getCvalues().add(tmpValues);
//						//主键返回值
//						stmt.getReturnPk().put(tmpS[0], tmpValues);
//					}else {
//						stmt.getCvalues().add(formatComValue(tmpS.length == 2 ?tmpS[1]:""
//						                          ,tmpColn.getDefaultValueAdd(),tmpColn.getInputtypeAdd(),request));
//					}
//				}
//			}
//			
//			//拼接语句
//			StringBuffer whStr = new StringBuffer();
//			//拼接sql
//			stmt.getSql().append("insert into ");
//			stmt.getSql().append(" "+tableName+" (");
//			for (int i = 0; i < stmt.getCname().size(); i++) {
//				stmt.getSql().append(stmt.getCname().get(i));
//				if (stmt.getCvalues().get(i).indexOf("\\-")>0 && stmt.getCvalues().get(i).split("\\-")[1].equals("FUN")) {
//					whStr.append(stmt.getCvalues().get(i).split("\\-")[0]);
//					stmt.getCvalues().remove(i);
//					stmt.getCname().remove(i);
//					i--;
//				}else {
//					whStr.append("?");
//				}
//				if (i < stmt.getCname().size()-1) {
//					stmt.getSql().append(",");
//					whStr.append(",");
//				}
//			}
//			stmt.getSql().append(") values (" + whStr.toString() + ")");
//			
//		}else if (sou != null && sou.equals("2")) {
//			//sql:   update  表名    set  字段=值 where 字段 = 值
//			//拼接更新sql
//			for (int i = 0; i < infoS.length; i++) {
//				tmpInfo = infoS[i];
//				tmpS[0] = tmpInfo.substring(0,infoS[i].indexOf("-"));
//				tmpS[1] = tmpInfo.substring(infoS[i].indexOf("-")+1,infoS[i].length());
//				tmpColn = columnsMap.get(tmpS[0]);
//				if (tmpColn != null) {
//					if (tmpColn.getIsPkAdd() != null && tmpColn.getIsPkAdd().equals("T")) {
//						stmt.getWname().add(tmpS[0]);
//						if (tmpS[1] == null || tmpS[1].equals("null") || tmpS[1].equals("")) {
//							throw new RuntimeException("["+dsId+"."+tmpS[0]+"]"+"无法修改,请确保数据的唯一性");
//						}
//						stmt.getWvalues().add(tmpS[1]);
//					}else {
//						stmt.getCname().add(tmpS[0]);
//						stmt.getCvalues().add(formatComValue(tmpS.length == 2 ?tmpS[1]:""
//						                          ,tmpColn.getDefaultValueAdd(),tmpColn.getInputtypeAdd(),request));
//					}
//				}
//			}
//			
//			if (!(stmt.getWvalues().size() > 0 && (stmt.getWname().size() == stmt.getWvalues().size()))) {
//				throw new RuntimeException("无法修改,修改没有限定范围,请确保["+dsId+"]在数据库中有主键[IS_PK_ADD='T']");
//			}
//			
//			if (!(stmt.getCvalues().size() >0 && (stmt.getCname().size() == stmt.getCvalues().size()))) {
//				throw new RuntimeException("没有需要修改的值");
//			}
//			
//			//拼接更新语句
//			StringBuffer whStr = new StringBuffer();
//			//拼接sql
//			stmt.getSql().append("update ");
//			stmt.getSql().append(" "+tableName+" set ");
//			for (int i = 0; i < stmt.getCname().size(); i++) {
//				stmt.getSql().append(stmt.getCname().get(i));
//				System.out.print(stmt.getCname().get(i)+":");
//				System.out.println(stmt.getCvalues().get(i));
//				if (stmt.getCvalues().get(i).indexOf("\\-")>0 && stmt.getCvalues().get(i).split("\\-")[1].equals("FUN")) {
//					stmt.getSql().append(stmt.getCvalues().get(i).split("\\-")[0]);
//					stmt.getCvalues().remove(i);
//					stmt.getCname().remove(i);
//					i--;
//				}else {
//					stmt.getSql().append("=?");
//				}
//				if (i < stmt.getCname().size()-1) {
//					stmt.getSql().append(",");
//				}
//			}
//			
//			//拼接条件
//			for (int i = 0; i < stmt.getWname().size(); i++) {
//				whStr.append(stmt.getWname().get(i));
//				if (stmt.getWvalues().get(i).indexOf("\\-")>0 && stmt.getWvalues().get(i).split("\\-")[1].equals("FUN")) {
//					whStr.append(stmt.getWvalues().get(i).split("\\-")[0]);
//					stmt.getWvalues().remove(i);
//					stmt.getWname().remove(i);
//					i--;
//				}else {
//					whStr.append("=?");
//				}
//				if (i < stmt.getWname().size()-1) {
//					whStr.append(",");
//				}
//			}
//			stmt.getSql().append(" where " + whStr.toString());
//			
//		}else {
//			throw new RuntimeException("不是通用保存按钮，保存标志位为空！请检查！");
//		}
//		return stmt;
//	} 
//	
//	
//	//字段默认值
//	//Default_value_add 默认值的形式
//	//A:自增                   				A:XTID0001
//	//B:常量	       				B:ST0001
//	//C:session    				C:uid
//	//D:数据库函数或者方法名		D:sysdate
//	//E:32位码					E:32
//	//F:自定义方法	   			F:function name
//	//为空则不修改
//	public String formatPkValue(String inV,String dbDefaultV,String type,HttpServletRequest request){
//		String value = "";
//		String dflag = "";
//		String dflagV = "";
//		if (dbDefaultV != null && (dbDefaultV.indexOf(":") > 0) && (dbDefaultV.indexOf(":") < dbDefaultV.length()-1) ) {
//			dflag = dbDefaultV.split(":")[0];
//			dflagV = dbDefaultV.split(":")[1];
//		}
//		if (dbDefaultV != null) {
//			if (dflag.equals("A")) {//A:自增         
//				
//			}else if (dflag.equals("D")) {//D:数据库函数或者方法名
//				value = dflagV+"-FUN";
//			}else if (dflag.equals("E")) {//E:32位码
//				value = UUID32.newGuid();
//			}else if (dflag.equals("F")) {//F:自定义方法
//				
//			}
//		}else {
//			if (inV != null && inV.trim().equals("")) {
//				inV = UUID32.newGuid();
////				throw new RuntimeException("主键没有值，请到数据库将主键设置为必填");
//			}
//			value = inV;
//		}
//		return value.toString();
//	}
//	
//	
//	public String formatComValue(String inV,String dbDefaultV,String type,HttpServletRequest request){
//		String value = "";
//		String dflag = "";
//		String dflagV = "";
//		if (dbDefaultV != null && (dbDefaultV.indexOf(":") > 0) && (dbDefaultV.indexOf(":") < dbDefaultV.length()-1) ) {
//			dflag = dbDefaultV.split(":")[0];
//			dflagV = dbDefaultV.split(":")[1];
//		}
//		if (dbDefaultV != null) {
//			if (dflag.equals("A")) {//A:自增         
//				
//			}else if (dflag.equals("B")) {//B:常量
//				value = dflagV;
//			}else if (dflag.equals("C")) {//C:session
//				
//			}else if (dflag.equals("D")) {//D:数据库函数或者方法名
//				value = dflagV+"-FUN";
//			}else if (dflag.equals("E")) {//E:32位码
//				value = UUID32.newGuid();
//			}else if (dflag.equals("F")) {//F:自定义方法
//				
//			}
//		}else {
//			if(type != null && (type.equals("datetime")|| type.equals("date")|| type.equals("time"))){
//				if (inV.indexOf("-") >= 0) {
//					throw new RuntimeException("["+inV+"]"+"时间字段[inputType]没有配置，请检查");
//				}
//				value = inV +"-DATE";
//			}else {
//				value = inV;
//			}
//		}
//		return value.toString();
//	}
//	
//	
//	
//	
	/***********************************************************
	 * V2.0.0 通用保存通用信息
	 * *********************************************************/
	/****
	 * 1.  data.msg == 'success'  infob 主键的返回字符串     $.messager.alert('操作提示','sou =1 2 保存/更新成功','')  （info  提示信息—）
	 * 				   'fail'     info  提示信息“失败的原因”    $.messager.alert('操作提示',data.info,'info')
	 * 				   'error'	  info  提示					$.messager.alert('操作提示',data.info,'error')
	 * @param receiveObjs
	 * @param request
	 * @return
	 * @author Xuzq
	 * @date 2014-4-19 下午03:20:29
	 */
	@RequestMapping("/commU")
	@ResponseBody
	public ReturnObject saveCommU(@RequestBody ReceiveZM receiveZMobj,HttpServletRequest request,HttpSession session){
		//zmReceiveObj   //receiveObjs
		ReturnObject returnObject = new ReturnObject();
		try {
			System.out.println("获取参数:"+receiveZMobj.getZmReceiveObj().getDiu());
			returnObject = this.commonSaveService.saveCommU(receiveZMobj,session,request);
			returnObject.getTraState();  // 执行之后的状态
		} catch (Exception e) {
			e.printStackTrace();
			returnObject.setMsg("error");
			returnObject.setInfo(e.getMessage());
		}
		return returnObject;
	}
	/**
	 * 折扣策略的保存
	 * @param receiveZMobj
	 * @param tjId
	 * @param request
	 * @param session
	 * @return
	 */
	@RequestMapping("/zkclSave")
	@ResponseBody
	public ReturnObject zkclSave(@RequestBody ReceiveZM receiveZMobj,String tjId,HttpServletRequest request,HttpSession session){
		ReturnObject returnObject = new ReturnObject();
		try {
			
			returnObject = this.commonSaveService.saveCommU(receiveZMobj,session,request);
			returnObject.getTraState();  // 执行之后的状态
		
		} catch (Exception e) {
			e.printStackTrace();
			returnObject.setMsg("error");
			returnObject.setInfo(e.getMessage());
		}
		return returnObject;
	}
	
	
	/***
	 * 保存所有的列表 包含外键的信息
	 * @param receiveList
	 * @param request
	 * @param session
	 * @return
	 * @author Xuzq
	 * @date 2014-6-4 上午09:07:54
	 */
	@RequestMapping("/commL")
	@ResponseBody
	public ReturnObject saveCommL(@RequestBody ReceiveList receiveList,HttpServletRequest request,HttpSession session){
		//zmReceiveObj   //receiveObjs
		ReturnObject returnObject = new ReturnObject();
		try {
			
			returnObject = this.commonSaveService.saveCommL(receiveList,session);
			
		} catch (Exception e) {
			e.printStackTrace();
			returnObject.setMsg("error");
			returnObject.setInfo(e.getMessage());
		}
		return returnObject;
	}
	
}
